<!--
 * @Descripttion: 
 * @Version: 
 * @Author: gaohj
 * @Date: 2022-12-28 16:30:12
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2022-12-28 17:47:38
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // fn(); 正常
        // function fn(){
        //     console.log("我是声明式的函数");
        // }
        // fn();// 正常
        // var fn = 'yyds';
        // fn();
        

        //打开浏览器 
        // 1.fn()
        // 2.function fn(){console.log("我是声明式的函数");}
        // 3.fn();
        // 4.var fn = 'yyds';
        // 5.fn();


        // 预解析 

        // 1. 不需要 
        // 2. 需要
        //  声明了一个变量  取名 fn 并且将一个函数放到箱子中 (并且赋值为一个函数)
        // 3. 不需要
        // 4. 需要
            //  声明了一个变量取名 fn 暂时不赋值  
        // 5. 不需要 

        // 上面两个名字重复了  
        // 一个是变量名  一个是函数名 
        // 重名了 以函数为准

        // 所以预解析结束 fn 变量里边是个函数 


        // 执行阶段

        // 1.fn();
        //  // 预解析阶段 fn是一个函数 正常调用 
        // 2.函数定义 不执行
        // 3.fn(); 正常调用  
        // 4.fn = 'yyds'; 把字符串'yyds'放到箱子里 
        // 因为之前是一个函数 所以字符串把函数覆盖了最终是字符串 
        // 5.fn();  
        // 报错 因为fn里边是一个字符串 不是函数 
        // fn() 把它当函数调用 
        // 所以报错 fn is not a function

        // fn2 is not a function  fn2不是一个函数 
        // 名字(); 把名字当函数调用 ()表示执行的意思;

        fn2(); // 我是声明式的函数
        var fn2 = 100;
        fn2(); // 报错 fn2 is not a function
        function fn2(){
            console.log("我是声明式的函数");
        }
        fn2();

        // 函数名  变量名  重名了 以函数名为准

        // 打开浏览器 

        // 1.fn2();
        // 2.var fn2 = 100;
        // 3.fn2();
        // 4.function fn2(){console.log("我是声明式的函数");}
        // 5.fn2();

        // 预解析阶段

        // 1.不需要
        // 2.需要
        //  声明了一个变量取名 fn2 暂时不赋值
        // 3.不需要
        // 4.需要
        //   声明了一个变量取名 fn2 并且将一个函数放到箱子中 (并且赋值为一个函数)

        // 5.不需要

        // 预解析结束  fn2 变量被声明 里边是一个函数

        // 执行阶段

        // 1. fn2();  正常调用 
        // 2. fn2 = 100; 100 覆盖了函数 fn2 里边是100 不是函数
        // 3. fn2();  报错 fn2 is not a function 出错 
        // 4 5 都不执行了  
            // 4. 函数定义 不执行
            // 5. fn2();  报错 fn2 is not a function

    </script>
</body>
</html>